package com.credit.jumu.calculator.utils;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import java.util.List;

/**
 * 类型帮助类
 *
 * @author Administrator
 */
public class TypeUtils {
	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name              名称
	 * @param defaultJsonObject 默认json
	 * @return 返回jsonObject.getJsonObject(name)
	 */
	public static JSONObject getJsonObject(JSONObject jsonObject, String name,
										   JSONObject defaultJsonObject) {
		if (jsonObject == null)
			return defaultJsonObject;
		try {
			if (!jsonObject.containsKey(name)) {
				return defaultJsonObject;
			}
			return jsonObject.getJSONObject(name);
		} catch (JSONException e) {

			return defaultJsonObject;
		}
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param defaultJsonObject 默认JsonObject
	 * @param names             多个名称
	 * @return jsonObject.getObject(names[i])...
	 */
	public static JSONObject getJsonObject(JSONObject jsonObject,
										   JSONObject defaultJsonObject, String... names) {
		if (names.length == 1)
			return getJsonObject(jsonObject, names[0]);
		JSONObject currJsonObject = jsonObject;
		for (int i = 0; i < names.length; i++) {
			currJsonObject = getJsonObject(currJsonObject, names[i]);
			if (currJsonObject == null)
				return defaultJsonObject;
		}

		return currJsonObject;
	}

	/**
	 * 得到JsonObject里面的name
	 *
	 * @param jsonObject
	 * @param names      多个名称
	 * @return jsonObject.getObject(names[i])...
	 */
	public static JSONObject getJsonObject(JSONObject jsonObject,
										   String... names) {
		return getJsonObject(jsonObject, null, names);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getJsonObject(name)
	 */
	public static JSONObject getJsonObject(JSONObject jsonObject, String name) {
		return getJsonObject(jsonObject, name, null);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name         名称
	 * @param defaultValue 默认json
	 * @return 返回jsonObject.getString(name)
	 */
	public static String getJsonString(JSONObject jsonObject, String name,
									   String defaultValue) {
		if (jsonObject == null)
			return defaultValue;
		try {
			if (!jsonObject.containsKey(name)) {
				return defaultValue;
			}
			return jsonObject.getString(name);
		} catch (JSONException e) {
			return defaultValue;
		}
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getString(name)
	 */
	public static String getJsonString(JSONObject jsonObject, String name) {
		return getJsonString(jsonObject, name, null);

	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name         名称
	 * @param defaultValue 默认值
	 * @return 返回jsonObject.getInt(name)
	 */
	public static int getJsonInteger(JSONObject jsonObject, String name,
									 int defaultValue) {
		if (jsonObject == null)
			return defaultValue;
		try {
			if (!jsonObject.containsKey(name))
				return defaultValue;
			return jsonObject.getInt(name);
		} catch (Exception e) {
			return defaultValue;
		}

	}

	/**
	 * 得到boolean
	 *
	 * @param jsonObject
	 * @param name         名称
	 * @param defaultValue 默认值
	 * @return 返回jsonObject.getBoolean(name)
	 */
	public static boolean getJsonBoolean(JSONObject jsonObject, String name,
										 boolean defaultValue) {
		if (jsonObject == null)
			return defaultValue;
		try {
			if (!jsonObject.containsKey(name))
				return defaultValue;
			return jsonObject.optBoolean(name);
		} catch (Exception e) {
			return defaultValue;
		}

	}

	/**
	 * 得到jsonArray中的一项(boolean)
	 *
	 * @param jsonArray
	 * @param index        下标
	 * @param defaultValue 默认值
	 * @return 返回jsonArray中的一项
	 */
	public static boolean getJsonBoolean(JSONArray jsonArray, int index,
										 boolean defaultValue) {
		if (jsonArray == null || index == jsonArray.size())
			return defaultValue;
		try {
			return jsonArray.optBoolean(index, defaultValue);

		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 得到jsonArray中的一项(boolean)
	 *
	 * @param jsonArray
	 * @param index     下标
	 * @return 返回jsonArray中的一项
	 */
	public static boolean getJsonBoolean(JSONArray jsonArray, int index) {
		return getJsonBoolean(jsonArray, index, false);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name         名称
	 * @param defaultValue 默认值
	 * @return 返回long
	 */
	public static long getJsonLong(JSONObject jsonObject, String name,
								   long defaultValue) {
		if (jsonObject == null)
			return defaultValue;
		try {
			if (!jsonObject.containsKey(name))
				return defaultValue;
			return jsonObject.getLong(name);
		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static long getJsonLong(JSONObject jsonObject, String name) {
		return getJsonLong(jsonObject, name, -1);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getInt(name)
	 */
	public static double getJsonDouble(JSONObject jsonObject, String name) {
		return getJsonDouble(jsonObject, name, -1);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name         名称
	 * @param defaultValue 默认值
	 * @return 返回jsonObject.getInt(name)
	 */
	public static double getJsonDouble(JSONObject jsonObject, String name,
									   double defaultValue) {
		if (jsonObject == null)
			return defaultValue;
		try {
			if (!jsonObject.containsKey(name))
				return defaultValue;
			return jsonObject.getDouble(name);
		} catch (Exception e) {
			return defaultValue;
		}

	}


	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getInt(name)
	 */
	public static int getJsonInteger(JSONObject jsonObject, String name) {
		return getJsonInteger(jsonObject, name, -1);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getInt(name)
	 */
	public static boolean getJsonBoolean(JSONObject jsonObject, String name) {
		return getJsonBoolean(jsonObject, name, false);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name             名称
	 * @param defaultJsonArray 默认JsonArray
	 * @return 返回jsonObject.getJSONArray(name)
	 */
	public static JSONArray getJsonArray(JSONObject jsonObject, String name,
										 JSONArray defaultJsonArray) {
		if (jsonObject == null)
			return defaultJsonArray;
		try {
			if (!jsonObject.containsKey(name))
				return defaultJsonArray;
			return jsonObject.getJSONArray(name);
		} catch (JSONException e) {

			return defaultJsonArray;
		}
	}

	/**
	 * 得到JsonObject里面的names
	 *
	 * @param jsonObject
	 * @param defaultJsonArray 默认JsonArray
	 * @param names            多个名称
	 * @return jsonObject.getObject(names[i])...getJsonArray(names[names.length-1
	 *])
	 */
	public static JSONArray getJsonArray(JSONObject jsonObject,
										 JSONArray defaultJsonArray, String... names) {
		if (names.length == 1)
			return getJsonArray(jsonObject, names[0], defaultJsonArray);
		JSONObject currJsonObject = jsonObject;
		for (int i = 0; i < names.length - 1; i++) {
			currJsonObject = getJsonObject(currJsonObject, names[i]);
			if (currJsonObject == null)
				return defaultJsonArray;
		}

		return getJsonArray(currJsonObject, names[names.length - 1],
				defaultJsonArray);

	}

	/**
	 * 得到JsonObject里面的names
	 *
	 * @param jsonObject
	 * @param names      多个名称
	 * @return jsonObject.getObject(names[i])...getJsonArray(names[names.length-1
	 *])
	 */
	public static JSONArray getJsonArray(JSONObject jsonObject, String... names) {
		return getJsonArray(jsonObject, null, names);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @param jsonObject
	 * @param name       名称
	 * @return 返回jsonObject.getJSONArray(name)
	 */
	public static JSONArray getJsonArray(JSONObject jsonObject, String name) {
		return getJsonArray(jsonObject, name, null);
	}

	/**
	 * 得到jsonObject里面的name
	 *
	 * @return 返回jsonObject.getJSONArray(name)
	 */
	public static JSONArray getJsonArray(JSONArray jsonArray, int index) {
		try {
			if (jsonArray != null) {
				if (jsonArray.size() > index) {
					return jsonArray.optJSONArray(index);
				}
			}
		} catch (Exception e) {
			return null;
		}
		return null;
	}

	/**
	 * 得到jsonArray长度
	 *
	 * @param jsonArray json数组
	 * @return 返回jsonArray长度
	 */
	public static int getJsonArraySize(JSONArray jsonArray) {
		if (jsonArray == null)
			return 0;
		return jsonArray.size();

	}

	/**
	 * 得到jsonArray长度
	 *
	 * @param jsonArray json数组
	 * @return 返回jsonArray长度
	 */
	public static int getJsonArraySize(List jsonArray) {
		if (jsonArray == null)
			return 0;
		return jsonArray.size();

	}

	/**
	 * 是否相等
	 *
	 * @param jsonObject
	 * @param name1      名称1
	 * @param name2      名称2
	 * @return 是否相等
	 */
	public static boolean isEqualsJsonObjectInt(JSONObject jsonObject,
												String name1, String name2) {
		return getJsonInteger(jsonObject, name1) == getJsonInteger(jsonObject,
				name2);
	}

	/**
	 * 得到jsonArray中的一项(Integer)
	 *
	 * @param jsonArray
	 * @param index        下标
	 * @param defaultValue 默认值
	 * @return 返回jsonArray中的一项
	 */
	public static int getJsonInteger(JSONArray jsonArray, int index,
									 int defaultValue) {
		if (jsonArray == null || index == jsonArray.size())
			return defaultValue;
		try {
			return jsonArray.getInt(index);

		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 得到jsonArray中的一项(Integer)
	 *
	 * @param jsonArray
	 * @param index     下标
	 * @return 返回jsonArray中的一项
	 */
	public static int getJsonInteger(JSONArray jsonArray, int index) {
		return getJsonInteger(jsonArray, index, -1);
	}

	/**
	 * 得到jsonArray中的一项(String)
	 *
	 * @param jsonArray
	 * @param index        下标
	 * @param defaultValue 默认值
	 * @return 返回jsonArray中的一项
	 */
	public static String getJsonString(JSONArray jsonArray, int index,
									   String defaultValue) {
		if (jsonArray == null || index == jsonArray.size())
			return defaultValue;
		try {
			return jsonArray.getString(index);

		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 得到jsonArray中的一项(String)
	 *
	 * @param jsonArray
	 * @param index     下标
	 * @return 返回jsonArray中的一项
	 */
	public static String getJsonString(JSONArray jsonArray, int index) {
		return getJsonString(jsonArray, index, null);
	}

	/**
	 * 得到jsonArray中的一项(JSONObject)
	 *
	 * @param jsonArray
	 * @param index        下标
	 * @param defaultValue 默认值
	 * @return 返回jsonArray中的一项
	 */
	public static JSONObject getJsonObject(JSONArray jsonArray, int index,
										   JSONObject defaultValue) {
		if (jsonArray == null || index == jsonArray.size())
			return defaultValue;
		try {
			return jsonArray.getJSONObject(index);

		} catch (Exception e) {
			return defaultValue;
		}
	}


	/**
	 * 得到jsonArray中的一项(JSONObject)
	 *
	 * @param jsonArray
	 * @param index     下标
	 * @return 返回jsonArray中的一项
	 */
	public static JSONObject getJsonObject(JSONArray jsonArray, int index) {
		return getJsonObject(jsonArray, index, null);
	}

	/**
	 * 得到jsonArray中的一项(JSONObject)
	 *
	 * @param jsonArray
	 * @param index     下标
	 * @return 返回jsonArray中的一项
	 */
	public static <T> T getListObject(List<T> jsonArray, int index) {
		return getListObject(jsonArray, index, null);
	}

	/**
	 * 得到jsonArray中的一项(JSONObject)
	 *
	 * @param jsonArray
	 * @param index        下标
	 * @param defaultValue 默认值
	 * @return 返回jsonArray中的一项
	 */
	public static <T> T getListObject(List<T> jsonArray, int index,
									  T defaultValue) {
		if (jsonArray == null || index == jsonArray.size())
			return defaultValue;
		try {
			return jsonArray.get(index);

		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 得到object在数字的位置
	 *
	 * @param objectArray
	 * @param object
	 * @return
	 */
	public static int getObjectInArrayIndex(Object[] objectArray, Object object) {
		try {
			if (object == null || objectArray == null || objectArray.length < 1)
				return -1;
			for (int i = 0; i < objectArray.length; i++) {
				if (object.equals(objectArray[i])) {
					return i;
				}
			}
			return -1;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	/**
	 * 得到对象
	 *
	 * @param objects
	 * @param index
	 * @param defaultObject
	 * @return
	 */
	public static Object getObject(Object[] objects, int index,
								   Object defaultObject) {
		try {
			if (objects.length > index) {
				return objects[index];
			}
		} catch (Exception e) {
			e.printStackTrace();
			return defaultObject;
		}
		return defaultObject;

	}

	/**
	 * 得到对象
	 *
	 * @param listData
	 * @param index
	 * @param <T>
	 * @return
	 */
	public static <T> T getObject(List<T> listData, int index) {
		if (index == -1 || listData == null || listData.size() <= 0 || listData.size() <= index) {
			return null;
		}
		return listData.get(index);
	}

	/**
	 * 得到长度
	 *
	 * @param listData
	 * @return
	 */
	public static int getListSize(List listData) {
		if (listData == null) {
			return 0;
		}
		return listData.size();
	}

}
